普林斯顿stata教程之stata编程

您所在的位置:网站首页 args stata 普林斯顿stata教程之stata编程

普林斯顿stata教程之stata编程

2023-04-24 07:11| 来源: 网络整理| 查看: 265

这部分是对Stata编程的简单介绍。主要讨论宏和循环,并展示如何编写简单程序。编程是一个很大的主题,我在这里仅进行一些提示,希望能激发你进一步学习的兴趣。本文所涵盖的材料将帮助你更有效地使用Stata。

Stata 9引入了一种新的非常强大的矩阵编程语言Mata。这极大扩展了程序员的工具,远远超出了这里所讨论的宏,但是Mata是一个值得单独讨论的主题,所以本文不会对此进行介绍。然而,您在这里的努力不会白费,因为Mata仅是Stata编程的补充,而不是完全替代。 要了解关于Stata编程的更多信息,我建议您使用Kit Baum的Stata编程简介,现在已发布到第二版。您也可以查阅用户指南第18章,根据需要参考。Nick Cox在Stata Journal的专栏也是学习Stata的绝佳资源。

3.1 宏

宏是一个与一些文本相关联的名称,依据范围可分为全局宏与本地宏。

3.1.1 在本地宏中存储文本

本地宏名称最多为31个字符,并且仅在当前环境(语境)中被识别(console,do file或programe)。

本地宏定义语句为local name [=] text,输入 `name' (请注意使用反引号和左引号。)进行调用。

第一种变体不带等号,用于存储任意文本,最多可达64k个字符(在Stata SE中最多可达100万个字符)。文本通常用引号引起来,但不是必须。

示例:回归方程中的控制变量

有时你需要运行一堆回归方程,其中包括一组标准的控制变量,比如age,agesq,education,和income。当然,你可以在每个等式中键入这些名称,或者可以剪切和粘贴名称,但这些方法很繁琐且容易出错。聪明的方法是定义一个宏

local controls age agesq education income

然后,输入命令

regress outcome treatment `controls'

它与一下命令完全等价

regress outcome treatment age agesq education income

如果只运行一次回归,不需要保存信息,但是如果你必须运行多个具有不同结果或处理方式的模型,使用宏可以提高效率并确保一致性。

这种方法还有一个好处是,如果以后你意识到你应该对某个控制变量取对数,你只需改变宏的定义即可,比如将income改为logimcome,对宏所做的改变会在所有后续模型中应用。

警告:输入不存在的宏不是错误;,只是会返回一个空字符串。所以要小心拼写正确的宏名称。如果输入regress outcome treatment `contrls',Stata将读取regress outcome treatment,因为宏contrls不存在。如果你输入control的话,也会发生同样的情况,因为宏名称不能按变量名称的方式缩写。

示例:管理虚拟变量

假设你正在参与人口调查工作,受访人按年龄以5年分为一组,从age15to19到age45to49共分为七组。其中有六组会作为虚拟变量在回归中使用。定义一个宏

local age "age20to24 age25to29 age30to34 age35to39 age40to44 age45to49"

然后在你的回归模型中使用

regress ceb `age' urban

这不仅更短,更具可读性,而且更接近你的意图。这也使得改变对年龄的表示更为容易,如果您以后决定使用线性和二次项表示年龄,则只需定义宏local age "age agesq"并重新运行模型。请注意,第一个age是宏的名称,第二个是变量的名称。在此我用引号使代码更清晰。

请注意嵌套的宏。如果一个宏中包含了另一个宏(在此不妨称为子宏),新宏的内容是在创建那一刻就确定的(解析),而不是在被评估时被解析。例如,如果你定义宏local controls `age' income education。在定义新宏control时Stata认为其中包含子宏age并对子宏内容展开解读,就算在未来你改变了子宏age的内容,新宏中保留的依然是创建时点子宏的内容与形式。

但是,有一种方法可以实现新宏随子宏同步更新的效果。诀窍是在定义宏时输入斜杠号避开宏评估字符local controls `age' income education。现在Stata不评估宏,所以controls内容变成了`age' income education。当宏controls被评估时,Stata才会发现它包含宏age并对其展开解读。

3.1.2 在本地宏中存储结果

第二种类型的宏定义local name = text(含等于号)用于存储结果。它指示Stata将右侧的文本视为表达式,对其进行评估,并在指定名称中存储结果的文本表达。

假设你只是运行一个回归,并想存储R平方结果,以便与后面的回归进行比较。你知道regress命令将残差平方和存储在e(r2)中,所以你认为如下命令将会奏效:

local rsq e(r2)

但事实并非如此。您的宏所存储是公式e(r2),如过你输入

display "`rsq'"

你看到的是一条公式,而不是我们所要的数值。解决方法是使用等号连接local rsq = e(r2),这会t提示Stata计算表达式并存储结果。

要看到差异,请尝试一下代码

. sysuse auto, clear (1978 Automobile Data) . quietly regress mpg weight . local rsqf e(r2) . local rsqv = e(r2) . di `rsqf' // this has the current R-squared .65153125 . di `rsqv' // as does this .65153125 . quietly regress mpg weight foreign . di `rsqf' // the formula has the new R-squared .66270291 . di `rsqv' // this guy has the old one .65153125

当你仅仅是想存储文本信息是也可以使用等号,但我并不推荐,尤其当你使用的是旧版Stata时,会带来不必要的麻烦。以local controls = "age agesq education income"为例,使用等号不影响正常工作,但会使右引号左边内容被Stata计算,并被标记为字符串格式——最多输入244个字符,而正常宏文本可输入更多内容。

3.1.3 全局宏与键盘映射

全局宏名称最多可包含32个字符,正如名称所示,它具有全局范围。

你可以定义一个全局宏,global name [=] text并使用$name进行计算。(你可能需要用${name}限定名称的结尾)

我建议你避免使用全局宏,因为存在名称冲突的可能性。一个有用的应用是使用键盘上的功能键映射。如果你在一个名字很长的共享网络文件夹上工作,请尝试

global F5 \\server\shared\research\project\subproject\

当你打F5时,Stata会替换全名。而你的do files可以使用命令do${F5}dofile(我们需要大括号来表明宏名称是F5,而不是F5dofile)

显然你不想在每次使用Stata时输入这个宏,你可以将其输入到你的profile.do文件——每次运行Stata时执行的一组命令。通常情况下,你的个人配置文件最好存储在Stata的启动目录C:\data中。help profilew了解更多信息。

3.1.4 关于宏的更多信息

宏也可用于使用扩展宏函数获取和存储关于系统或数据集中变量的信息。例如,你可以检索变量和值标签。还有一些命令可以管理你的宏集合,包括macro list和macro drop,help macro了解更多信息。

3.2 循环

循环用于完成重复性任务。Stata的命令允许循环遍历数字序列和包括变量列表在内的各种类型列表。在我们开始之前,不要忘记Stata自己做了很多循环。如果你想计算收入的对数,你可以在Stata中用一行代码来实现:

gen logincome = log(income)

这行代码隐晦地在所有观测值上循环,计算每个收入的对数,又称为矢量化操作。你可以自己编写循环,但是没有必要。第一,你不需要;第二,你的代码会比Stata内置循环慢很多

3.2.1 遍历数字序列循环

基本的循环命令采用这种形式

forvalues number = sequence { ... body of loop using `number' ... }

这forvalues是一个关键字,number是一个本地宏的名称,它将被设置为序列中的每个数字,sequence是一个如下形式的数值范围

min/max:从min到max以1为步长的数字序列,例如1/3产生1,2和 3 first(step)last:从first到last以step为步长依次排列的数字序列例如15(5)50为15,20,25,30,35,40,45和50。

(指定第二种序列的方法有两种,这里列出的是最清晰的,替代方案请参阅help forvalues)

开头的左大括号必须是第一行的最后一项(注释除外),并且循环必须以独立成行的右大括号结束。循环会对序列中的每个值执行一次并将结果保存在本地宏number(本例中宏名为number)中。

创建虚拟变量

这是我最喜欢的创建年龄组虚拟变量的方式。虽然Stata 11引入了因子变量,Stata 13改进了估算表格的标签,大大减少了“滚动自己的”虚拟变量的需求,但代码仍然具有启发性。

forvalues bot = 20(5)45 { local top = `bot' + 4 gen age`bot'to`top' = age >= `bot' & age


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3